package com.myh.cc.base

import android.content.Context
import android.databinding.BaseObservable
import android.databinding.ViewDataBinding
import com.myh.cc.network.RequestCallBack
import java.lang.reflect.ParameterizedType

/**
 * 类描述    ：  ViewModel
 * 创建人    ：  mayahao.
 * 创建时间   ：  2018/1/2.
 * 修改人    ：
 * 修改时间   ：
 * 修改备注   ：
 */
abstract class BaseModel<T: ViewDataBinding, M: IBaseControl> : BaseObservable(),IModel,RequestCallBack{

    /**
     * activity 作为 view
     */
    lateinit var UI: IModeActivity<T>

    /**
     *  databinding 对象
     */
    lateinit var mBinder: T

    /**
     * Control 主要做网络处理
     */
    lateinit var mControl: M


    /**
     * 获取 Context
     */
    fun getContext(): Context{

        return UI.getContext()
    }

    /**
     * 初始化 activity
     * 初始化 mBinder
     * 初始化 mControl
     */
    fun setView(activity: IModeActivity<T>){

        UI = activity
        mBinder = UI.getBinder()

        val genType = javaClass.genericSuperclass
        val params = (genType as ParameterizedType).actualTypeArguments
        val bizClass = params[1] as Class<*>
        try {
            mControl = bizClass.newInstance() as M
        } catch (e: InstantiationException) {
            e.printStackTrace()
        } catch (e: IllegalAccessException) {
            e.printStackTrace()
        }

    }



    override fun onCreate() {

    }

    override fun onStart() {

    }

    override fun onResume() {

    }

    override fun onStop() {

    }


    override fun beforeRequest(tag: Int) {
        onBeforeRequest(tag)
    }


    override fun success(data: Any, tag: Int) {
        UI.hideLoadingDialog()
        onSuccess(data,tag)
    }

    override fun error(errorMag: String, tag: Int) {
        UI.hideLoadingDialog()
        onError(errorMag,tag)

        // 错误统一提示 可以放在这里

    }

    /**
     * 取消 disposable
     * 隐藏 hideLoadingDialog
     */
    override fun onDestroy() {
       mControl.disposableCancel()
       UI.hideLoadingDialog()
    }


    abstract fun onBeforeRequest(tag: Int)

    abstract fun onSuccess(data: Any,tag: Int)

    abstract fun onError(errorMag: String,tag: Int)



}